package main

import (
	"bufio"
	"fmt"
	"io"
	"os"
	"strings"
)

const fileAdres string = "C:\\Users\\53598\\Desktop\\vscode\\go\\go-training\\go_book\\entry_level\\main.txt\\"

var fileName, content string

/*
首先是打印hello world，这里就不赘述了参考foundation/var。然后说明了golang不用加;和一些语法格式，
foundation/var例子都可以参考。强调了golang对格式要求很高，go的工具包中的gofmt工具会自动调整格式。
以及main包内置，参考foundation/package。
*/

// 找出重复行，需要命令行读取文件，vs code会有bug，已issue了
func findDup() {
	counts := make(map[string]int)
	//dlv debug --headless --listen=:2345 --log --api-version=2，go使用vs code无法输入输出,只能在22行打断点才能在
	//dlv 启动的服务器里（本地）查看上一轮的输出
	input := bufio.NewScanner(os.Stdin) //实例化一个输入bufio，读取检查包
	for input.Scan() {                  //扫描输入
		counts[input.Text()]++ //读取输入放入text里
	}
	for line, n := range counts {
		if n > 1 {
			/*printf的转义字符包括：
			%d:十进制整数
			%x, %o, %b: 十六进制，八进制，二进制
			%f, %g, %e: 浮点数
			%t: 布尔值
			%c: 字符unicode码
			%s: 字符串
			%q: 引号内的字符串
			%v：内置格式
			%T：任何类型
			%%：百分号
			*/
			fmt.Printf("这里是%d\t%s\n", n, line)
		}
	}
}

// 创建文件
func createWriteFile(fileName string, content string) {
	filePointer, err := os.OpenFile(fileAdres+fileName, os.O_CREATE|os.O_WRONLY, 0751)
	if err != nil {
		fmt.Println("文件创建失败", err)
		return
	}
	defer filePointer.Close() //全部读完后再关
	writer := bufio.NewWriter(filePointer)
	size, err := writer.Write([]byte(content)) //写入缓冲区
	writer.Flush()                             //写入从缓冲区
	if err == nil {
		fmt.Println("创建成功", size)
	} else {
		fmt.Printf("错误%T", err)
	}
}

// 从文件中读取数据
func readFile(fileName string) {
	p, err := os.OpenFile(fileAdres+fileName, os.O_RDONLY, 0751)
	if err != nil {
		fmt.Println("文件创建失败", err)
		return
	}
	defer p.Close() //全部读完后再关，先挂起需要检查
	reader := bufio.NewReader(p)
	var readString string
	for {
		readString, err = reader.ReadString('\n')
		if err != nil {
			fmt.Print(readString)
		} else if err == io.EOF {
			break
		} else {
			fmt.Println("读取失败")
			break
		}
	}
}

func main() {
	firstTry := os.Args[0] //os包提供与操作系统有关的工具，os.Args是命令行中实际允许的命令
	fmt.Print("os.Args第一项", firstTry)
	//打印一个循环，for loop参考foundation/processControl
	s, sep := "", ""
	out := []string{"a", "b", "c", "d"}
	for _, v := range out[1:] {
		s += sep + v
		sep = " "
	}
	fmt.Println(s)
	fmt.Println(strings.Join(out[1:], " ")) //string的Join函数实现与上述循环一样，更简洁
	findDup()
	fileName = "ceShi.txt"
	content = "写入成功了看"
	//放弃了没反应，不重要，web重要
	createWriteFile(fileName, content)
	readFile(fileName)
}
